package bytes

import (
	"bytes"
)

//**不要使用该函数**
//根据bytes.genSplit修改，但简化了部分操作，放在这里仅仅作为参考
func genSplit(a [][]byte, s []byte) [][]byte {
	var sep = []byte("abcde")
	var sepLen = len(sep)
	sLen := len(s)
	c := sep[0]
	start := 0
	na := 0
	for i := 0; i+sepLen <= sLen; i++ {
		if s[i] == c && (bytes.Equal(s[i:i+sepLen], sep)) {
			if len(a) <= na {
				a = append(a, s[start:i+sepLen])
			} else {
				a[na] = s[start : i+sepLen]
			}
			na++
			start = i + sepLen
			i += sepLen - 1
		}
	}
	if len(a) <= na {
		a = append(a, s[start:])
	} else {
		a[na] = s[start:]
	}
	return a[0 : na+1]
}

//与bytes.SplitAfterN当n为负值时的功能一致，但大幅优化了性能，耗时约为bytes.SplitAfterN的1/3
// s：源bytes，sep：分隔bytes，a：可重用结果缓存，nil则内部新建一个
func BytesSplit(s, sep []byte, a [][]byte) [][]byte {
	sLen := len(s)
	sepLen := len(sep)
	if sLen == 0 {
		return nil
	}

	c := sep[0]
	tempS := s
	cursor := 0
	start := 0
	na := 0
	for {
		idx := bytes.IndexByte(tempS, c)
		cursor += idx
		if idx >= 0 {
			if cursor <= sLen-sepLen {
				idx2 := idx + sepLen
				if bytes.Equal(tempS[idx:idx2], sep) {
					cursor += sepLen
					if len(a) <= na {
						a = append(a, s[start:cursor])
					} else {
						a[na] = s[start:cursor]
					}
					na++
					start = cursor
					if start == sLen {
						return a[0:na] //上面++过了，这里就不用+1
					} else {
						tempS = tempS[idx2:]
					}
				} else {
					cursor++
					tempS = tempS[idx+1:]
				}
			} else {
				if len(a) <= na {
					a = append(a, s[start:])
				} else {
					a[na] = s[start:]
				}
				return a[0 : na+1]
			}
		} else {
			if len(a) <= na {
				a = append(a, s[start:])
			} else {
				a[na] = s[start:]
			}
			return a[0 : na+1]
		}
	}
}
